Пример использования валидирующих EAI и IDN библиотек в коде Python

Материал из вики.поддерживаю.рф
Перейти к навигации Перейти к поиску

Пример проекта для бэкенда на Python

Примеры кода на Python доступны по этой ссылке.

Примеры кода на Python для универсального принятия

В этой папке вы найдете примеры кода для исполнения правил универсального принятия (UA) для библиотек Python. Исходный код находится в папке src.

Ниже перечислены используемые библиотеки, разъясняется процесс запуска скриптов на Python для проведения собственных тестов, а также приведена дополнительная информация.

Подготовка среды

Мы предлагаем использовать pip для установки зависимостей в Python, но можно использовать и другие методы. Установите Python и pip.

Следующие шаги рекомендуется выполнять из корневой папки Python.

Создайте виртуальную среду:

$ virtualenv venv

Создайте целевой каталог для виртуальной среды и установите необходимую библиотеку UA и зависимости:

$ source venv/bin/activate
$ pip install .

Бэкенд на Python для демо-сайта с поддержкой UA

Подготовка к работе

Бэкенд на Python использует фреймворк Flask. Сначала установите его в свою среду:

$ pip install -r src/backend/requirements.txt

Теперь можно запустить бэкенд:

$ export FLASK_APP=src/backend/ua_samples
$ export FLASK_ENV=development
$ flask run

Задайте конфигурацию бэкенда, отредактировав файл config.py.

Создайте докерный образ

Чтобы создать докерный образ для бэкенда, выполните команду:

$ docker build . -t ua-backend-python

Запустите бэкенд и проверьте порт 1234, выполнив следующую команду:

$ docker run -d --name ua-py -p 1234:5000 ua-backend-python

Инструменты CLI

Примеры кода для IDNA

idna

idna можно использовать для конвертирования U-метки в A-метку и наоборот. Библиотека предлагает разные способы конвертирования, и они описаны в соответствующей документации. Один из таких способов используется в примерах кода idna.

Примеры кода idna конвертируют U-метку на входе в A-метку или возвращают ошибку, если указан недопустимый домен. Так как idna не выполняет нормализацию, для нормализации входного домена в NFC используется стандартный модуль в Python unicodedata.

Для запуска примера кода idna выполните:

$ (venv) python src/bin/idna/idna_main.py --domain <domain>

Примеры кода для EAI

Используются наиболее простые примеры SMTP без механизмов аутентификации. Вы можете использовать для тестирования SMTP-сервер Mailhog. Основная реализация не поддерживает расширение SMTPUTF8, но его поддерживает этот вариант.

email_validator

Пример email_validator проверяет действительность электронного адреса на входе или возвращает ошибку, если адрес недействителен. В документации по email_validator четко сказано: «данная библиотека НЕ принимает устаревшие формы электронных адресов». Поэтому валидатор выполняет так называемую «прагматичную» проверку.

Например, он не принимает символ @ в имени почтового ящика, приведенного в кавычках, и не принимает имя почтового ящика в кавычках, хотя такой вариант обычно допустим. Стандарт RFC 5321 не рекомендует использовать строки в кавычках, чтобы гарантировать доставку почты, поэтому в большинстве случаев это допустимо. Чтобы запустить email_validator, выполните команду:

$ (venv) python src/bin/eai/email_validator_main.py --e <email-address>

smtplib

Пример кода smtplib пересылает письма на электронный адрес, указанный на входе, помечая их соответствующим образом, если электронный адрес содержит символы в кодировке UTF-8.

smtplib выполняет частичную проверку электронного адреса и обеспечивает корректную обработку EAI. Для оптимальной проверки электронного адреса (например, на соответствие доменной части адреса протоколу IDNA 2008) используется email_validator. Если SMTP-сервер не поддерживает SMTPUTF8, доступен примерный код более низкого уровня с возможностью конвертирования доменной части адреса в ASCII библиотекой idna (Важно: email_validator выполняет конвертацию в процессе проверки, также используя библиотеку idna, поэтому результат проверки следует использовать столько раз, сколько это возможно, во избежание повторной проверки).

Чтобы запустить smtplib, выполните команду:

$ (venv) python src/bin/eai/smtplib_main.py --to="<email-address>" --host=<smtp-sever> --port=<port>